﻿using System;
using System.Linq.Expressions;
using MoroMoro.Samples.ToDoList.Base.Domain.Specifications;
using MoroMoro.Samples.ToDoList.Domain.Categories;

namespace MoroMoro.Samples.ToDoList.Domain.ToDos
{
    /// <summary>
    /// <see cref="ToDo"/>の<see cref="ToDo.Title">タイトル</see>が特定のタイトルと一致するかどうかを判断します。
    /// </summary>
    [Serializable]
    public sealed class ToDoTitleSpecification : Specification<ToDo>
    {
        /// <summary>
        /// <see cref="ToDoTitleSpecification"/> クラスの新しいインスタンスを初期化します。
        /// </summary>
        /// <param name="title"><see cref="ToDo.Title">タイトル</see>。</param>
        public ToDoTitleSpecification(string title)
        {
            if (title == null)
            {
                throw new ArgumentNullException("title");
            }
            _title = title;
        }


        /// <summary>
        /// <see cref="ToDo.Title">タイトル</see>。
        /// </summary>
        private readonly string _title;


        /// <inheritdoc/>
        protected override Expression<Func<ToDo, bool>> CreateExpression()
        {
            return entity => (entity.Title == _title);
        }
    }
}
